/**
 * 向localStorage中添加json数据
 * @param storage 存储介质
 * @param key 存储key
 * @param value 存储值
 */
function addJson(storage: Storage, key: string, value: object) {
    storage.setItem(key, JSON.stringify(value));
}

/**
 * 从localStorage中获取json数据
 * @param storage 存储介质
 * @param key 存储key
 * @param defaultVal 当值不存在时, 返回的默认值
 */
function getJson<T>(storage: Storage, key: string, defaultVal: T | null = null): T | null {
    const valueStr = storage.getItem(key);
    if (valueStr) {
        return JSON.parse(valueStr);
    } else {
        return defaultVal ? defaultVal : null;
    }
}

/**
 * 向localStorage中添加字符串数据
 * @param storage 存储介质
 * @param key 存储key
 * @param value 存储值
 */
function addString(storage: Storage, key: string, value: string) {
    storage.setItem(key, value);
}

/**
 * 从localStorage中获取string数据
 * @param storage 存储介质
 * @param key 存储key
 * @param defaultVal 当值不存在时, 返回的默认值
 */
function getString(storage: Storage, key: string, defaultVal: string | null = null): string | null {
    const value = storage.getItem(key);
    return value ? value : defaultVal;
}

/**
 * 向localStorage中添加number数据
 * @param storage 存储介质
 * @param key 存储key
 * @param value 存储值
 */
function addNumber(storage: Storage, key: string, value: number) {
    storage.setItem(key, "" + value);
}

/**
 * 从localStorage中获取int数据
 * @param storage 存储介质
 * @param key 存储key
 * @param defaultVal 当值不存在时, 返回的默认值
 */
function getNumberInt(storage: Storage, key: string, defaultVal: number | null = null): number | null {
    const value = storage.getItem(key);
    return value ? parseInt(value) : defaultVal;
}

/**
 * 从localStorage中获取float数据
 * @param storage 存储介质
 * @param key 存储key
 * @param defaultVal 当值不存在时, 返回的默认值
 */
function getNumberFloat(storage: Storage, key: string, defaultVal: number | null = null): number | null {
    const value = storage.getItem(key);
    return value ? parseFloat(value) : defaultVal;
}

/**
 * 清除存储介质中的内容
 * @param storage
 */
function clear(storage: Storage) {
    storage.clear();
}

export default {
    localOpt: {
        /**
         * 向localStorage中添加json数据
         * @param key 存储key
         * @param value 存储值
         */
        addJson(key: string, value: object) {
            addJson(localStorage, key, value);
        },
        /**
         * 从localStorage中获取json数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getJson<T>(key: string, defaultVal: T | null = null): T | null {
            return getJson(localStorage, key, defaultVal);
        },
        /**
         * 向localStorage中添加字符串数据
         * @param key 存储key
         * @param value 存储值
         */
        addString(key: string, value: string) {
            addString(localStorage, key, value);
        },
        /**
         * 从localStorage中获取string数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getString(key: string, defaultVal: string | null = null): string | null {
            return getString(localStorage, key, defaultVal);
        },
        /**
         * 向localStorage中添加number数据
         * @param key 存储key
         * @param value 存储值
         */
        addNumber(key: string, value: number) {
            addNumber(localStorage, key, value);
        },
        /**
         * 从localStorage中获取int数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getNumberInt(key: string, defaultVal: number | null = null): number | null {
            return getNumberInt(localStorage, key, defaultVal);
        },
        /**
         * 从localStorage中获取float数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getNumberFloat(key: string, defaultVal: number | null = null): number | null {
            return getNumberFloat(localStorage, key, defaultVal);
        },
        /**
         * 清空localStorage
         */
        clear() {
            clear(localStorage);
        }
    },
    sessionOpt: {
        /**
         * 向 sessionStorage 中添加 json对象 数据
         * @param key 存储key
         * @param value 存储值
         */
        addJson(key: string, value: object) {
            addJson(sessionStorage, key, value);
        },
        /**
         * 从 sessionStorage 中获取 json对象 数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getJson<T>(key: string, defaultVal: T | null = null): T | null {
            return getJson(sessionStorage, key, defaultVal);
        },
        /**
         * 向 sessionStorage 中添加 string 数据
         * @param key 存储key
         * @param value 存储值
         */
        addString(key: string, value: string) {
            addString(sessionStorage, key, value);
        },
        /**
         * 从 sessionStorage 中获取 string 数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getString(key: string, defaultVal: string | null = null): string | null {
            return getString(sessionStorage, key, defaultVal);
        },
        /**
         * 向 sessionStorage 中添加 number 数据
         * @param key 存储key
         * @param value 存储值
         */
        addNumber(key: string, value: number) {
            addNumber(sessionStorage, key, value);
        },
        /**
         * 从 sessionStorage 中获取 int 数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getNumberInt(key: string, defaultVal: number | null = null): number | null {
            return getNumberInt(sessionStorage, key, defaultVal);
        },
        /**
         * 从 sessionStorage 中获取 float 数据
         * @param key 存储key
         * @param defaultVal 当值不存在时, 返回的默认值
         */
        getNumberFloat(key: string, defaultVal: number | null = null): number | null {
            return getNumberFloat(sessionStorage, key, defaultVal);
        },
        /**
         * 清空 sessionStorage 数据
         */
        clear() {
            clear(sessionStorage);
        }
    },
    /**
     * 清除 localStorage 与 sessionStorage 数据
     */
    clear() {
        clear(localStorage);
        clear(sessionStorage);
    }
}
